package database;

import java.util.LinkedList;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author Aubry Pirian
 * @version 0.2
 */
public interface IDbConnector {

	/**
	 * Methode retournant l'objet Connection d'acces a la base
	 * @throws ClassNotFoundException : impossible d'accéder au driver JDBC
	 * @throws SQLException
	 */
	public void connect() throws ClassNotFoundException,SQLException;

	/**
	 * Méthode de création d'une table
	 * @param tableName	: nom de la table
	 * @param attrs		: attributs de la table
	 * @throws NoSuchFieldException : attribut non valide
	 * @throws SQLException
	 */
	public void createTable(String name, LinkedList<TypedAttribute> attrs) throws NoSuchFieldException,SQLException;
	
	/**
	 * Méthode de suppression d'une table
	 * @param tableName	: table à supprimer
	 * @throws SQLException
	 * @throws NoSuchFieldException	: attribut non valide
	 */
	public void dropTable(String name) throws SQLException,NoSuchFieldException;
	
	/**
	 * Méthode de vidage de table
	 * @param tableName	: table à vider
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public void emptyTable(String name) throws SQLException,NoSuchFieldException;
	
	/**
	 * Méthode d'insertion d'un enregistrement
	 * @param tableName	: table
	 * @param attrs		: liste d'attributs et valeurs
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public void insert(String table, LinkedList<ValuedAttribute> attrs) throws SQLException,NoSuchFieldException;
	
	/**
	 * Méthode de selection
	 * @param tableName	: table
	 * @param attrs		: attributs à sélectionner
	 * @param where		: condition sur les enregistrements à sélectionner
	 * @param orderBys	: ordre(s) de sélection
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public ResultSet select(String tableName, LinkedList<String> attrs,
			Clause where, LinkedList<String> orderBys) throws SQLException,NoSuchFieldException;
	
	/**
	 * Methode de selection d'enregistrements dans la base de donnees
	 * @param table : nom de la table
	 * @param attrs : attributs a selectionner, null pour les selectionner tous
	 * @param where : clause de selection
	 */
	public ResultSet select(String table, LinkedList<String> attrs, Clause where) throws SQLException,NoSuchFieldException;
	
	/**
	 * Methode de selection d'enregistrements dans la base de donnees retournant tous les attributs
	 * 	Ne gère (pour l'instant) que les requêtes simples sans jointures
	 * @param table	: nom de la table
	 * @param attrs	: attributs a selectionner, null pour les selectionner tous
	 * @param where	: clause de selection
	 */
	public ResultSet select(String table, Clause where) throws SQLException,NoSuchFieldException;
	
	/**
	 * Methode de selection d'enregistrements dans la base de donnees sans condition
	 * 	Ne gère (pour l'instant) que les requêtes simples sans jointures
	 * @param table	: nom de la table
	 * @param attrs	: attributs a selectionner, null pour les selectionner tous
	 * @param where	: clause de selection
	 */
	public ResultSet select(String table, LinkedList<String> attrs) throws SQLException,NoSuchFieldException;
	
	/**
	 * Methode de selection d'enregistrements dans la base de donnees sans condition, retournant tous les attributs
	 * 	Ne gère (pour l'instant) que les requêtes simples sans jointures
	 * @param table	: nom de la table
	 * @param attrs	: attributs a selectionner, null pour les selectionner tous
	 * @param where	: clause de selection
	 */
	public ResultSet select(String table) throws SQLException,NoSuchFieldException;
	
	
	/**
	 * Méthode de modification
	 * @param tableName	: table à modifier
	 * @param values	: attributs à modifer et leurs nouvelles valeurs
	 * @param where		: condition sur les enregistrements
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public void update(String table, LinkedList<ValuedAttribute> values, Clause where)
		throws SQLException,NoSuchFieldException;
	
	/**
	 * Méthode de modification (sans condition)
	 * @param tableName	: table à modifier
	 * @param values	: attributs à modifer et leurs nouvelles valeurs
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public void update(String tableName, LinkedList<ValuedAttribute> values)
		throws SQLException,NoSuchFieldException;
	
	/**
	 * Méthode de suppression d'enregistrements
	 * @param tableName	: nom de la table
	 * @param where		: clause de sélection des enregistrements
	 * @throws SQLException
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public void delete(String tableName, Clause where)
		throws SQLException,NoSuchFieldException;

}
